package com.briup.pts.config.auth;

import com.briup.pts.domain.bean.Account;

/**
 * 当前登录用户的上下文|用户数据容器
 */
public class SecurityUserContext {
    // ThreadLocal：能够以线程作为存储数据的key，存储你指定的数据，当在一个请求中，通常都是使用一个线程来处理任务
    // 每个用户每次发送的请求都会分配一个线程去处理，即使用ThreadLocal能够很好的将用户与用户之间的数据进行隔离
    private static final ThreadLocal<Account> USER_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 将当前登录用户数据放入到 ThreadLocal 容器中
     * @param user 当前登录用户数据
     */
    public static void setCurrentUser(Account user){
        USER_THREAD_LOCAL.set(user);
    }

    /**
     * 获取当前登录用户数据
     * @return User 当前登录用户对象
     */
    public static Account currentUser(){
        // 在ThreadLocal底层中使用了一个 ThreadLocalMap 来存储数据，
        // 但每次获取数据都是通过 Thread.currentThread(); 获取当前线程，以线程作为key获取数据
        // 所以在获取数据时，无需传入key就能获取
        return USER_THREAD_LOCAL.get();
    }

    public static String userId(){
        return currentUser().getAccountId();
    }

    public static String username(){
        return currentUser().getUsername();
    }

    public static void clear(){
        // 当请求任务结束后，需要注意清除本线程中存储的 当前用户数据，否则可能出现内存泄露的风险
        USER_THREAD_LOCAL.remove();
    }
}
